package cn.yangliu.config;

import cn.yangliu.tools.SerialPortManager;
import com.fazecast.jSerialComm.SerialPort;
import org.springframework.stereotype.Component;

import javax.annotation.PreDestroy;
import java.util.Collection;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

/**
 * the type of com-tool
 *
 * <p>
 * .
 *
 * @author 杨柳
 * @date 2021-09-28
 */
@Component
public class SerialPortContainer {

    /**
     * 缓存
     */
    private final Map<String, SerialPort> serialPortMap = new ConcurrentHashMap<>();

    /**
     * 放入缓存
     *
     * @param key 配置名
     * @param serialPort 串口
     * @return 成功与否
     */
    public boolean put(String key, SerialPort serialPort) {
        if (serialPortMap.containsKey(key)) {
            return false;
        }
        serialPortMap.put(key, serialPort);
        return true;
    }

    /**
     * 根据配置名查询串口
     *
     * @param key 配置名
     * @return 串口
     */
    public SerialPort get(String key) {
        return serialPortMap.get(key);
    }

    /**
     * 根据串口查询配置名
     *
     * @param serialPort 串口
     * @return 配置名
     */
    public String getKey(SerialPort serialPort) {
        Set<Map.Entry<String, SerialPort>> entrySet = serialPortMap.entrySet();
        for (Map.Entry<String, SerialPort> entry: entrySet) {
            if (Objects.equals(entry.getValue(), serialPort)) {
                return entry.getKey();
            }
        }
        return null;
    }

    /**
     * 删除串口
     *
     * @param key 配置名
     * @return 成功与否
     */
    public boolean remove(String key) {
        if (!serialPortMap.containsKey(key)) {
            return false;
        }
        serialPortMap.remove(key);
        return true;
    }

    /**
     * 收尾退出
     */
    @PreDestroy
    public void preDestroy() {
        Collection<SerialPort> serialPorts = serialPortMap.values();
        for (SerialPort serialPort : serialPorts) {
            SerialPortManager.closePort(serialPort);
        }
    }
}
